package atguigu.cglib.cglibMethod;

import java.lang.reflect.Method;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

/**
 * 手动实现一个代理类
 * 
 * 代理模式的好处,可以在要被代理的对象的方法外,增加一些代码逻辑
 * @author ex_yejing1
 *
 */
public class ProductProxy implements MethodInterceptor{
	// 要代理的对象,从原始类向上抽取的一个接口
	private IProduct target = null;

	public ProductProxy(IProduct target) {
		this.target = target;
	}
	
	public IProduct getProductProxy() {
		// 代理对象由哪一个类加载器负责加载
		Class loader = target.getClass();
		return (IProduct) Enhancer.create(loader, this);
	}
	
	public void pre() {
		System.out.println("前置处理");
	}
	
	public void after() {
		System.out.println("后置处理");
	}

	@Override
	public Object intercept(Object obj, Method method, 
			Object[] args, MethodProxy proxy) throws Throwable {
		Object returnValue = null;
		if ("saleProduct".equals(method.getName())) {
			pre(); // 前置处理
			Float money = (float) (0.8 * (Float) args[0]);
			returnValue = method.invoke(target, money);
			after(); // 后置处理
		}
		return returnValue;
	}
}
